import Taro from '@tarojs/taro'

/**
 * 存储数据
 * @param {string} key 键名
 * @param {any} value 值
 * @param {boolean} sync 是否同步操作，默认true
 */
export const set = (key, value, sync = true) => {
  try {
    if (sync) {
      return Taro.setStorageSync(key, value)
    }
    return Taro.setStorage({ key, data: value })
  } catch (error) {
    console.error('Storage Set Error:', error)
    return false
  }
}

/**
 * 获取数据
 * @param {string} key 键名
 * @param {boolean} sync 是否同步操作，默认true
 * @returns {any} 存储的值，不存在则返回null
 */
export const get = (key, sync = true) => {
  try {
    if (sync) {
      return Taro.getStorageSync(key) || null
    }
    return Taro.getStorage({ key }).then(res => res.data).catch(() => null)
  } catch (error) {
    console.error('Storage Get Error:', error)
    return null
  }
}

/**
 * 删除数据
 * @param {string} key 键名
 * @param {boolean} sync 是否同步操作，默认true
 */
export const remove = (key, sync = true) => {
  try {
    if (sync) {
      return Taro.removeStorageSync(key)
    }
    return Taro.removeStorage({ key })
  } catch (error) {
    console.error('Storage Remove Error:', error)
    return false
  }
}

/**
 * 清空所有数据
 * @param {boolean} sync 是否同步操作，默认true
 */
export const clear = (sync = true) => {
  try {
    if (sync) {
      return Taro.clearStorageSync()
    }
    return Taro.clearStorage()
  } catch (error) {
    console.error('Storage Clear Error:', error)
    return false
  }
}

/**
 * 获取所有数据的key
 * @param {boolean} sync 是否同步操作，默认true
 * @returns {string[]} key数组
 */
export const keys = (sync = true) => {
  try {
    if (sync) {
      const res = Taro.getStorageInfoSync()
      return res.keys
    }
    return Taro.getStorageInfo().then(res => res.keys)
  } catch (error) {
    console.error('Storage Keys Error:', error)
    return []
  }
}

/**
 * 获取存储信息
 * @param {boolean} sync 是否同步操作，默认true
 * @returns {Object} 存储信息，包含 keys、currentSize、limitSize
 */
export const info = (sync = true) => {
  try {
    if (sync) {
      return Taro.getStorageInfoSync()
    }
    return Taro.getStorageInfo()
  } catch (error) {
    console.error('Storage Info Error:', error)
    return null
  }
}

/**
 * 判断key是否存在
 * @param {string} key 键名
 * @returns {boolean} 是否存在
 */
export const has = (key) => {
  return get(key) !== null
}

/**
 * 设置带过期时间的数据
 * @param {string} key 键名
 * @param {any} value 值
 * @param {number} expires 过期时间(ms) 默认7天
 */
export const setExpires = (key, value, expires = 7 * 24 * 60 * 60 * 1000) => {
  const data = {
    value,
    expires: Date.now() + expires
  }
  return set(key, data)
}

/**
 * 获取带过期时间的数据
 * @param {string} key 键名
 * @returns {any} 未过期返回值，过期返回null
 */
export const getExpires = (key) => {
  const data = get(key)
  if (!data) return null

  if (Date.now() > data.expires) {
    remove(key)
    return null
  }
  return data.value
}

export default {
  set,
  get,
  remove,
  clear,
  keys,
  info,
  has,
  setExpires,
  getExpires
}
